package pe.com.upc.edu.rtt.comprarentradas.service.impl;

import java.io.IOException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import javax.jms.JMSException;

import org.springframework.stereotype.Service;

import pe.com.entidad.bancaria.TarjetaServicesSoapProxy;
import pe.com.upc.edu.rtt.Asiento;
import pe.com.upc.edu.rtt.Cliente;
import pe.com.upc.edu.rtt.ClienteServicesSoapProxy;
import pe.com.upc.edu.rtt.CompraEntrada;
import pe.com.upc.edu.rtt.ComprarEntradasServicesSoapProxy;
import pe.com.upc.edu.rtt.EventoDeportivo;
import pe.com.upc.edu.rtt.EventoServicesSoapProxy;
import pe.com.upc.edu.rtt.ReservaAsiento;
import pe.com.upc.edu.rtt.ReservarAsientosServicesSoapProxy;
import pe.com.upc.edu.rtt.comprarentradas.bean.AsientoBean;
import pe.com.upc.edu.rtt.comprarentradas.bean.PartidoBean;
import pe.com.upc.edu.rtt.comprarentradas.service.CompararEntradasService;
import pe.com.upc.edu.rtt.msg.MessageSender;
import pe.com.upc.edu.rtt.rest.client.WCFAsientosServiceRestClient;
import pe.com.upc.edu.rtt.rest.client.impl.WCFAsientosServiceRestClientImpl;

import com.google.gson.Gson;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;

@Service("CompararEntradasService")
public class CompararEntradasServiceImpl implements CompararEntradasService {

	private static Gson gson = new Gson();
	private static final Log _log = LogFactoryUtil.getLog(CompararEntradasService.class);	
	private static EventoServicesSoapProxy proxyEventoServices = new EventoServicesSoapProxy();
	private static WCFAsientosServiceRestClient httpRestWcfAsientosServiceRestClient = new WCFAsientosServiceRestClientImpl();
	private static ComprarEntradasServicesSoapProxy proxyComprarEntradasServicesLocator = new ComprarEntradasServicesSoapProxy();
	private static ReservarAsientosServicesSoapProxy proxSoapProxy = new ReservarAsientosServicesSoapProxy();
	private static ClienteServicesSoapProxy clienteServicesSoapProxy = new ClienteServicesSoapProxy();
	private static TarjetaServicesSoapProxy tarjetaServicesSoapProxy = new TarjetaServicesSoapProxy();
	
	public PartidoBean obtenerFechaEventoPartido(long idpartido) {		
		try {
			EventoDeportivo eventoDeportivo = proxyEventoServices.getEvento(new Long(idpartido).intValue());			
			PartidoBean partidoBean = new PartidoBean();				
			partidoBean.setIdPartido(eventoDeportivo.getIdEvento() );
			partidoBean.setTitulo(eventoDeportivo.getDescripcion());
			partidoBean.setFechapartido(eventoDeportivo.getFechaInicio());
			partidoBean.setFechapartidofin(eventoDeportivo.getFechaFinEvent());
			partidoBean.setCantidadEntradas(eventoDeportivo.getLimiteEntradas());
			partidoBean.setPrecio(eventoDeportivo.getPrecioEntrada());
			
			return partidoBean;
		} catch (RemoteException e) {
			_log.error("Error al optener el evento Deportivo:",e);
		}
		return null;
	}
	
	@Override
	public List<AsientoBean> listarAsientosPorPartido(long idpartido) {
		try {
			_log.error("listarAsientosPorPartido idpartido :"+idpartido);
			List<Asiento> listaAsientos =	httpRestWcfAsientosServiceRestClient.getListaAsientoDisponiblePorEvento(new Long(idpartido).intValue());
			if((listaAsientos!=null) && (listaAsientos.size()>0)){
				List<AsientoBean> listaAsientosBean = new ArrayList<AsientoBean>();
				AsientoBean asientoBean = null;
				for (Asiento asiento : listaAsientos) {
					asientoBean = new AsientoBean();
					asientoBean.setIdAsiento(asiento.getIdAsiento());
					asientoBean.setNumero(asiento.getNumero());
					listaAsientosBean.add(asientoBean);
				}
				return listaAsientosBean;
			}
		} catch (IOException e) {
			_log.error("Error los asientos :",e);
		}
		return null;
	}

	@Override
	public String comprarEntradaService(String uuid, String emailuser,String tipoPago, String entidadBancaria, String pag_num_tarjeta, String partido, int[] listaAsientos) {
		try {
			String msg = "Compra Exitosa, Le estaremos enviado un correo con los detalles de su compra";
			CompraEntrada compra = proxyComprarEntradasServicesLocator.comprarEntradaOnline(uuid, Integer.parseInt(partido), listaAsientos, Integer.parseInt(tipoPago), entidadBancaria, pag_num_tarjeta);
			compra.setEventoDeportivo( proxyEventoServices.getEvento(new Long(partido).intValue()));			
			enviarAlMQCorreoConfirmacionCompra(uuid,emailuser,compra);			
			return 	msg;	
		} catch (NumberFormatException e) {
			_log.error(" NumberFormatException comprarEntradaService :",e);
			return e.getMessage();
		} catch (RemoteException e) {
			_log.error(" RemoteException comprarEntradaService :",e);
			return e.getMessage();
		} catch (JMSException e) {
			_log.error(" RemoteException comprarEntradaService :",e);
			return e.getMessage();
		}
	}

	private void enviarAlMQCorreoConfirmacionCompra(String uuid, String emailuser,  CompraEntrada compra) throws JMSException {
		MessageSender.sendMessages("compra","MQCorreoConfirmacionCompra",uuid,emailuser,gson.toJson(compra));		
	}

	@Override
	public String reservarEntradasOnline(String uuid, String emailuser, String partido, int[] listaAsientos) {

		try {
			String msg = "Compra Exitosa, Le estaremos enviado un correo con los detalles de su compra";
			ReservaAsiento reservaAsiento = proxSoapProxy.reservarAsiento(uuid, Integer.parseInt(partido), listaAsientos, "");	
			reservaAsiento.setEventoDeportivo( proxyEventoServices.getEvento(new Long(partido).intValue()));
			enviarAlMQCorreoConfirmacionReserva(uuid,emailuser,reservaAsiento);
			return msg;			
		} catch (NumberFormatException e) {
			_log.error(" NumberFormatException comprarEntradaService :",e);
			return e.getMessage();
		} catch (RemoteException e) {
			_log.error(" RemoteException comprarEntradaService :",e);
			return e.getMessage();
		} catch (JMSException e) {
			_log.error(" JMSException comprarEntradaService :",e);
			return e.getMessage();
		}
		
	}

	private void enviarAlMQCorreoConfirmacionReserva(String uuid,String emailuser, ReservaAsiento reservaAsiento) throws JMSException {
		MessageSender.sendMessages("reserva","MQCorreoConfirmacionReserva",uuid,emailuser, gson.toJson(reservaAsiento));	
	}

	@Override
	public int cantidadDeEntradasPorEvento(String uuid, int eventoPartido) {		
		try {
			Cliente c = clienteServicesSoapProxy.getCliente(uuid);		
			int cantidad = httpRestWcfAsientosServiceRestClient.cantidadDeEntradasCompradasPorClientePorEvneto(c.getIdcliente(), eventoPartido);
			return cantidad;
		} catch (RemoteException e) {
			e.printStackTrace();		
		} catch (IOException e) {
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public boolean numeroTarjetaValido(String pag_num_tarjeta, String entidadBancaria) throws Exception {		
		try {
			if(tarjetaServicesSoapProxy.getTarjeta(entidadBancaria,pag_num_tarjeta) != null){
				return true;
			}else
				return false;
		} catch (RemoteException e) {
			e.printStackTrace();
			throw new Exception("No se ubica la tarjeta ne el sistema externo, intentelo denuevo.");
		}	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Servicio de la entidad Bancaria "+entidadBancaria + " no esta disponible");
		}		
	}

}
